from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.IMeshData import *
from OCC.Core.Message import *
from OCC.Core.gp import *
from OCC.Core.GeomAbs import *
from OCC.Core.TopoDS import *


class IMeshTools_MeshAlgoType(IntEnum):
    IMeshTools_MeshAlgoType_DEFAULT: int = ...
    IMeshTools_MeshAlgoType_Watson: int = ...
    IMeshTools_MeshAlgoType_Delabella: int = ...

IMeshTools_MeshAlgoType_DEFAULT = IMeshTools_MeshAlgoType.IMeshTools_MeshAlgoType_DEFAULT
IMeshTools_MeshAlgoType_Watson = IMeshTools_MeshAlgoType.IMeshTools_MeshAlgoType_Watson
IMeshTools_MeshAlgoType_Delabella = IMeshTools_MeshAlgoType.IMeshTools_MeshAlgoType_Delabella

class IMeshTools_Context(IMeshData_Shape):
    def __init__(self) -> None: ...
    def BuildModel(self) -> bool: ...
    def ChangeParameters(self) -> IMeshTools_Parameters: ...
    def Clean(self) -> None: ...
    def DiscretizeEdges(self) -> bool: ...
    def DiscretizeFaces(self, theRange: Message_ProgressRange) -> bool: ...
    def GetEdgeDiscret(self) -> IMeshTools_ModelAlgo: ...
    def GetFaceDiscret(self) -> IMeshTools_ModelAlgo: ...
    def GetModel(self) -> IMeshData_Model: ...
    def GetModelBuilder(self) -> IMeshTools_ModelBuilder: ...
    def GetModelHealer(self) -> IMeshTools_ModelAlgo: ...
    def GetParameters(self) -> IMeshTools_Parameters: ...
    def GetPostProcessor(self) -> IMeshTools_ModelAlgo: ...
    def GetPreProcessor(self) -> IMeshTools_ModelAlgo: ...
    def HealModel(self) -> bool: ...
    def PostProcessModel(self) -> bool: ...
    def PreProcessModel(self) -> bool: ...
    def SetEdgeDiscret(self, theEdgeDiscret: IMeshTools_ModelAlgo) -> None: ...
    def SetFaceDiscret(self, theFaceDiscret: IMeshTools_ModelAlgo) -> None: ...
    def SetModelBuilder(self, theBuilder: IMeshTools_ModelBuilder) -> None: ...
    def SetModelHealer(self, theModelHealer: IMeshTools_ModelAlgo) -> None: ...
    def SetPostProcessor(self, thePostProcessor: IMeshTools_ModelAlgo) -> None: ...
    def SetPreProcessor(self, thePreProcessor: IMeshTools_ModelAlgo) -> None: ...

class IMeshTools_CurveTessellator(Standard_Transient):
    def PointsNb(self) -> int: ...
    def Value(self, theIndex: int, thePoint: gp_Pnt) -> Tuple[bool, float]: ...

class IMeshTools_MeshAlgo(Standard_Transient):
    pass

class IMeshTools_MeshAlgoFactory(Standard_Transient):
    def GetAlgo(self, theSurfaceType: GeomAbs_SurfaceType, theParameters: IMeshTools_Parameters) -> IMeshTools_MeshAlgo: ...

class IMeshTools_MeshBuilder(Message_Algorithm):
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theContext: IMeshTools_Context) -> None: ...
    def GetContext(self) -> IMeshTools_Context: ...
    def Perform(self, theRange: Message_ProgressRange) -> None: ...
    def SetContext(self, theContext: IMeshTools_Context) -> None: ...

class IMeshTools_ModelAlgo(Standard_Transient):
    def Perform(self, theModel: IMeshData_Model, theParameters: IMeshTools_Parameters, theRange: Message_ProgressRange) -> bool: ...

class IMeshTools_ModelBuilder(Message_Algorithm):
    def Perform(self, theShape: TopoDS_Shape, theParameters: IMeshTools_Parameters) -> IMeshData_Model: ...

class IMeshTools_Parameters:
    def __init__(self) -> None: ...
    @staticmethod
    def RelMinSize() -> float: ...

class IMeshTools_ShapeExplorer(IMeshData_Shape):
    def __init__(self, theShape: TopoDS_Shape) -> None: ...
    def Accept(self, theVisitor: IMeshTools_ShapeVisitor) -> None: ...

class IMeshTools_ShapeVisitor(Standard_Transient):
    @overload
    def Visit(self, theFace: TopoDS_Face) -> None: ...
    @overload
    def Visit(self, theEdge: TopoDS_Edge) -> None: ...

# harray1 classes
# harray2 classes
# hsequence classes

